#ifndef __USART_DRV_H__
#define __USART_DRV_H__
#include "gd32f30x.h"
#include <stdio.h>
#define BAUDRATE 											115200    //usart波特率  8/115200=0.069ms  发送一个字节的为0.069ms
#define USART_INT_PRIORITY  			    15,0    	//usart中断优先级
#define USART_DMA_DATA_BUFF_LEN 	    100     // usart 一次最多接收100个字节

typedef struct {
    uint32_t uartNo;         //usart编号
    rcu_periph_enum rcuUart; // usart 时钟
    rcu_periph_enum rcuGpio; // gpio 时钟
    uint32_t gpio;           //端口
    uint32_t txPin;          //发送引脚
    uint32_t rxPin;          //接收引脚
    uint8_t irq;             //usart在中断向量表的编号
    uint32_t dmaNo;          // DMAx
    rcu_periph_enum rcuDma;  //dma rcu
    dma_channel_enum dmaCh;  //dma 通道
} UsartInfoStruct;


/**
 * @desc  : usart 初始化
 * @date  : 2025-03-25
 * @author: AnRui
 * @note  : 包含引脚 usart外设 dma外设 初始化
 */
void UsartDrvInit(void);

/**
 * @desc  : 发送1byte数据
 * @date  : 2025-03-25
 * @author: AnRui
 * @note  : 把数据放到数据寄存器中会自动的把数据放到移位寄存器中
 *          数据寄存器为空 就可以继续放下一个数据啦
 *          移位寄存器为空 说明数据发送完毕
 *          一次发送1字节(8bit)数据
 *          usart_flag_get  结果是RESET 代表不为空
 *          如果发送完 需要关闭发送功能  需要等待移位寄存器为空
 */
void UsartSendByte(uint8_t value);
/**
 * @desc  : 注册接收数据函数指针
 * @date  : 2025-03-26
 * @author: AnRui
 * @param : func - {参数说明}:
 * @note  : 哪个功能需要接收usart数据 就把自己的接受数据的函数注册到pProcUartDataFunc
 *          注意:pProcUartDataFunc这个函数是在usart的中断中被调用 不可以写复杂的逻辑
 */
void regUsartInteruptCallFunc(void (*func)(uint8_t* data, uint32_t len));
#endif // __USART_DRV_H__
